﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;

/// <summary>
/// Summary description for Callback
/// </summary>
public sealed class Callback
{
    public static string _eventArgument;
    private static Label lb = new Label();
    private static Label nombreGrilla = new Label();
    private static Label nombreddlist = new Label();
    private static GridView gv = new GridView();
    private static DropDownList ddl = new DropDownList();
    private static DataSet ds = new DataSet();

    public Callback()
    {
        //
        // TODO: Add constructor logic here
        //
    }
    /// <summary>
    /// Utilizar este metodo para insertar datos en la base de datos, pide 3 parametros
    /// </summary>
    /// <param name="metodo">Coloca aqui el nombre del metodo que realiza la insercion en la BD, debe devolver un booleano</param>
    /// <param name="bien">Colocar aqui la frase que se debe mostrar en pantalla si la insercion en la BD fue satisfactoria</param>
    /// <param name="mal">Colocar aqui la frease que se debe mostrar en pantalla si no se pudo insertar datos en la BD</param>
    /// <returns></returns>
    public static string _insertar(bool metodo, string bien, string mal)
    {
        if (metodo) lb.Text = bien;
        else lb.Text = mal;

        StringWriter sr = new StringWriter();
        HtmlTextWriter htm = new HtmlTextWriter(sr);
        lb.RenderControl(htm);
        htm.Flush();
        return sr.ToString();
    }

    /// <summary>
    /// Utilizar este metodo para actualizar datos en la base de datos, pide 3 parametros
    /// </summary>
    /// <param name="metodo">Coloca aqui el nombre del metodo que realiza la actualizacion en la BD, debe devolver un booleano</param>
    /// <param name="bien">Colocar aqui la frase que se debe mostrar en pantalla si la actualizacion en la BD fue satisfactoria</param>
    /// <param name="mal">Colocar aqui la frease que se debe mostrar en pantalla si no se pudo actualizar los datos en la BD</param>
    /// <returns></returns>
    public static string _actualizar(bool metodo, string bien, string mal)
    {
        if (metodo) lb.Text = bien;
        else lb.Text = mal;

        StringWriter sr = new StringWriter();
        HtmlTextWriter htm = new HtmlTextWriter(sr);
        lb.RenderControl(htm);
        htm.Flush();
        return sr.ToString();
    }
    /// <summary>
    /// Utilizar este metodo para eliminar datos en la base de datos, pide 3 parametros
    /// </summary>
    /// <param name="metodo">Coloca aqui el nombre del metodo que realiza la eliminacion en la BD, debe devolver un booleano<</param>
    /// <param name="bien">Colocar aqui la frase que se debe mostrar en pantalla si la eliminacion en la BD fue satisfactoria</param>
    /// <param name="mal">Colocar aqui la frease que se debe mostrar en pantalla si no se pudo eliminar los datos en la BD</param>
    /// <returns></returns>
    public static string _eliminar(bool metodo, string bien, string mal)
    {
        if (metodo) lb.Text = bien;
        else lb.Text = mal;

        StringWriter sr = new StringWriter();
        HtmlTextWriter htm = new HtmlTextWriter(sr);
        lb.RenderControl(htm);
        htm.Flush();
        return sr.ToString();
    }

    /// <summary>
    /// Utilizar este metodo si se desea mostrar una grilla SIN BOTONES
    /// </summary>
    /// <param name="metodo">Coloca aqui el nombre del metodo que devuelve el DataSet luego de realizar la consulta en la BD</param>
    /// <param name="mal">Coloca aqui una frease por si el DataSet es nulo, es decir si no se encontraron resultados en la busqueda</param>
    /// <returns></returns>
    public static string _mostrarGrilla(DataSet metodo, string mal)
    {
        //gv = null;
        if (metodo != null)
        {
            lb.Text = "grilla";
            nombreGrilla.Text = _valores(1)[1];
            gv.DataSource = metodo;
            gv.DataBind();
        }
        else lb.Text = mal;

        StringWriter sr = new StringWriter();
        HtmlTextWriter htm = new HtmlTextWriter(sr);
        lb.RenderControl(htm);
        nombreGrilla.RenderControl(htm);
        gv.RenderControl(htm);
        htm.Flush();
        return sr.ToString();
    }

    /*public static string _mostrarGrilla(DataSet metodo, string nombreBoton, string IdDivAmostrar, string mal, params string valores)
    {
        Label botonGrilla = new Label();
        Label nombreFuncion = new Label();
        Label nombreEtiqueta = new Label();
        Random r = new Random();


        if (metodo != null)
        {
            lb.Text = "grillaBoton";
            nombreGrilla.Text = _valores(1)[1];
            botonGrilla.Text = nombreBoton;
            nombreFuncion.Text = nombreBoton + r.Next(1000, 10000);
            nombreEtiqueta.Text = IdDivAmostrar;
            gv.DataSource = metodo;
            gv.DataBind();
        }
        else lb.Text = mal;

        StringWriter sr = new StringWriter();
        HtmlTextWriter htm = new HtmlTextWriter(sr);
        lb.RenderControl(htm);//vector0 
        nombreGrilla.RenderControl(htm);//vector1
        gv.RenderControl(htm);//vector2
        botonGrilla.RenderControl(htm);//vector3
        nombreFuncion.RenderControl(htm);//vector4
        nombreEtiqueta.RenderControl(htm);//vector5
        htm.Flush();
        return sr.ToString();
    }*/


    /// <summary>
    /// Utilizar este metodo si se desea mostrar una grilla CON BOTONES
    /// </summary>
    /// <param name="metodo">Coloca aqui el nombre del metodo que devuelve el DataSet luego de realizar la consulta en la BD</param>
    /// <param name="nombreBoton">Colocar el nombre del boton que deseamos que aparezca en la grilla</param>
    /// <param name="IdDivInput">Colocar el ID del div donde apareceran los textBoxex luego de hacer click en el boton de la grilla</param>
    /// <param name="eliminarPrimeraColumna">Es un booleano por si deseamos eliminar la primera columna de la grilla, true = si, false = no (todavia no esta programado xD asi que coloquen cualquier cosa)</param>
    /// <param name="mal">Coloca aqui una frease por si el DataSet es nulo, es decir si no se encontraron resultados en la busqueda</param>
    /// <param name="valores">OJO: aqui se aceptan valores por pares, es decir si desean que se muestren los campos de la columna 1 de la grilla
    /// deben escribr lo siguiente: "Perfil", "1"... donde perfil seria el nombre del campo del textbox y "1" seria el valor en la columna 1
    /// para mas informacion entrar a la siguiente WEB: www.nomejoroben.com xD</param>
    /// <returns></returns>
    public static string _mostrarGrilla(DataSet metodo, string nombreBoton, string IdDivInput,  bool eliminarPrimeraColumna, string mal, params object[] valores)
    {
        Label botonGrilla = new Label();
        Label nombreFuncion = new Label();
        Label nombreEtiqueta = new Label();
        Random r = new Random();

        StringWriter sr = new StringWriter();
        HtmlTextWriter htm = new HtmlTextWriter(sr);

        if (metodo != null)
        {
            lb.Text = "grillaBoton";
            lb.RenderControl(htm);//vector0
 
            lb.Text = _valores(1)[1];//vector1 - nombre del div donde se muestra la grilla
            lb.RenderControl(htm);
            
            gv.DataSource = metodo;
            gv.DataBind();
            gv.RenderControl(htm);//vector2 - es la grilla

            botonGrilla.Text = nombreBoton;
            botonGrilla.RenderControl(htm);//vector3 - el nombre que tendra el boton en la grilla

            nombreFuncion.Text = nombreBoton + r.Next(1000, 10000);
            nombreFuncion.RenderControl(htm);//vector4 - el nombre de la funcion que tendra el boton de la grilla

            nombreEtiqueta.Text = IdDivInput;
            nombreEtiqueta.RenderControl(htm);//vector5 - el id del div donde se mostraran los input deseados


            //a continuacion se recorre el object[] valores para pasar todos sus valores al script que mostrara los datos.


            for (int i = 0; i < valores.Length; i++)
            {
                lb.Text = valores[i].ToString();
                lb.RenderControl(htm);//vector6 a mas
            }

            htm.Flush();
            return sr.ToString();
            
        }
        else
        {
            lb.Text = mal;

            lb.RenderControl(htm);//vector0 
            htm.Flush();
            return sr.ToString();

        }


        /*
         utilizar un unico lbl para enviar todos los valores de la siguiente forma:
         * primer valor <--- nombre 
         * segundo valor <-- valor que esta dentro del imput que se creara
         * 
         
         */




        //lb.RenderControl(htm);//vector0 
        //nombreGrilla.RenderControl(htm);//vector1
        gv.RenderControl(htm);//vector2
        botonGrilla.RenderControl(htm);//vector3
        nombreFuncion.RenderControl(htm);//vector4
        nombreEtiqueta.RenderControl(htm);//vector5
        htm.Flush();
        return sr.ToString();
    }



    public static string _mostrarDropDownList(DataSet metodo, string dataTextField, string dataValueField, string mal)
    {
        //gv = null;
        if (metodo != null)
        {
            lb.Text = "ddlist";
            nombreddlist.Text = _valores(1)[1];
            ddl.DataSource = metodo;
            ddl.DataTextField = dataTextField;
            ddl.DataValueField = dataValueField;
            ddl.DataBind();
            ddl.Items.Insert(0, "Seleccionar");
        }
        else lb.Text = mal;

        StringWriter sr = new StringWriter();
        HtmlTextWriter htm = new HtmlTextWriter(sr);
        lb.RenderControl(htm);
        nombreddlist.RenderControl(htm);
        ddl.RenderControl(htm);
        htm.Flush();
        return sr.ToString();
    }
    public static string _default()
    {
        StringWriter sr = new StringWriter();
        HtmlTextWriter htm = new HtmlTextWriter(sr);
        lb.Text = "No se encontro una accion para el evento seleccionado, Consulte con el administrador.";
        lb.RenderControl(htm);
        htm.Flush();
        return sr.ToString();
    }
    public static string _error(Exception e)
    {
        StringWriter sr = new StringWriter();
        HtmlTextWriter htm = new HtmlTextWriter(sr);
        lb.Text = e.Message;
        lb.RenderControl(htm);
        htm.Flush();
        return sr.ToString();
    }
    public static string[] _valores()
    {
        return separarArgumentos(obtenerTamañoVector());
    }
    public static string[] _valores(int indiceVector)
    {
        return separarArgumentos(obtenerTamañoVector(), indiceVector);
    }

    private static string[] separarArgumentos(int tamañoVector)
    {
        string[] vector;
        vector = new string[tamañoVector];
        int contador = 0;
        for (int i = 0; i < _eventArgument.Length; i++)
        {
            if (_eventArgument[i] != '$')
            {
                vector[contador] += _eventArgument[i].ToString();
            }
            else
            {
                contador++;
            }

        }
        return vector;
    }
    private static string[] separarArgumentos(int tamañoVector, int indiceVector)
    {
        string[] vector;
        vector = new string[tamañoVector];
        int contador = 0;
        for (int i = 0; i < _eventArgument.Length; i++)
        {
            if (_eventArgument[i] != '$')
            {
                vector[contador] += _eventArgument[i].ToString();
            }
            else
            {
                if (contador == indiceVector) break;
                contador++;

            }

        }
        return vector;
    }
    private static int obtenerTamañoVector()
    {
        int tamañoVector = 1;
        for (int i = 0; i < _eventArgument.Length; i++)
        {
            if (_eventArgument[i] == '$')
            {
                tamañoVector++;
            }
        }
        return tamañoVector;
    }

}